/**
 *  fileName:有效的数独
 *  time:2021/8/20
 *  todo:请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ，验证已经填入的数字是否有效即可。

 数字 1-9 在每一行只能出现一次。
 数字 1-9 在每一列只能出现一次。
 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。（请参考示例图）
 数独部分空格内已填入了数字，空白格用 '.' 表示。

 注意：

 一个有效的数独（部分已被填充）不一定是可解的。
 只需要根据以上规则，验证已经填入的数字是否有效即可。
  

 作者：力扣 (LeetCode)
 链接：https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2f9gg/
 来源：力扣（LeetCode）
 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 */
/**
 * @param {character[][]} board
 * @return {boolean}
 */
var isValidSudoku = function (board) {
  const delete_dot = (arr) => {
    return arr.filter(item => item !== '.').sort()
  }

  const calc_repeat = (arr) => {
    for (let i = 0; i < arr.length - 1; i++) {
      if (arr[i] === arr[i + 1]) {
        return false
      }
    }
    return true
  }
  for (let i = 0; i < board.length; i++) {
    if (!calc_repeat(delete_dot(board[i]))) {
      return false
    }
  }
  for (let i = 0; i < board.length; i++) {
    let arr_col_item = []
    for (let j = 0; j < board.length; j++) {
      arr_col_item.push(board[j][i])
    }
    if (!calc_repeat(delete_dot(arr_col_item))) {
      return false
    }
  }

  for (let i = 0; i < 3; i++) {
    for (let j = 0; j < 3; j++) {
      let arr_box = []
      for (let k = 0; k < 3; k++) {
        for (let l = 0; l < 3; l++) {
          arr_box.push(board[j * 3 + k][i * 3 + l])
        }
      }
      if (!calc_repeat(delete_dot(arr_box))) {
        return false
      }
    }

  }
  return true

}

let board =
  [['5', '3', '.', '.', '7', '.', '.', '.', '.']
    , ['6', '.', '.', '1', '9', '5', '.', '.', '.']
    , ['.', '9', '8', '.', '.', '.', '.', '6', '.']
    , ['8', '.', '.', '.', '6', '.', '.', '.', '3']
    , ['4', '.', '.', '8', '.', '3', '.', '.', '1']
    , ['7', '.', '.', '.', '2', '.', '.', '.', '6']
    , ['.', '6', '.', '.', '.', '.', '2', '8', '.']
    , ['.', '.', '.', '4', '1', '9', '.', '.', '5']
    , ['.', '.', '.', '.', '8', '.', '.', '7', '9']]

console.log(isValidSudoku(board))
